package spring.event;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.support.AbstractApplicationContext;

/**
 * Spring 事件驱动: 自定义事件类型. <p>
 * ApplicationEventPublisher接口, 作为事件发布者（ApplicationContext接口继承了该接口，担当着事件发布者的角色）。<p>
 * ApplicationEventMulticaster接口, 负责管理 ApplicationListener 和真正发布 ApplicationEvent（ApplicationContext是委托给它完成的）<p</p>
 *
 * {@link AbstractApplicationContext#refresh() refresh()}方法中的 <p>
 * 第八步：{@link AbstractApplicationContext#initApplicationEventMulticaster()} 向容器注册了 SimpleApplicationEventMulticaster（默认），也可以自己声明一个 事件传播器<p>
 * 第十步：{@link AbstractApplicationContext#registerListeners()} 把所有 ApplicationListener添加进 ApplicationEventMulticaster
 * 进行管理（注意此处并不包括@EventListener标注的注解方法）<p>
 * 第十二步：{@link AbstractApplicationContext#finishRefresh()} 方法里的publishEvent(new ContextRefreshedEvent(this)) <p>
 * 都是和事件机制相关的方法。<p>
 *
 * @author ME
 * @date   2019/12/21
 */
public class HungerEvent extends ApplicationEvent {

    private boolean async = false;

    public boolean isAsync() {
        return async;
    }

    /**
     * 创建一个事件<p></p>
     *
     * @param source 发布事件时任意自己想传递的值
     */
    public HungerEvent(Object source) {
        super(source);
        System.out.println("[Event Producer]: Thread-" + Thread.currentThread().getName() + " 发布了事件 `HungerEvent`!");
    }
}
